﻿using System.Collections.Generic;
using StockholmsStad.Runtime.Serialization.DataContract;
using StockholmsStad.Data.Entity;

namespace StockholmsStad.Data.Interfaces
{
    /// <summary>
    /// Administration kring språk i applikationen
    /// </summary>
    public interface ILanguageAgent
    {
        /// <summary>
        /// Lägg till ett nytt språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="language">Språket som ska läggas till</param>
        /// <returns>Det nya språkets primärnyckel</returns>
        int AddLanguage(IDataContext context, string language);

        /// <summary>
        /// Uppdatera ett språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="language">Språket som ska ändras</param>
        /// <returns>Det nya språkets primärnyckel</returns>
        void UpdateLanguage(IDataContext context, ValueIdPair language);

        /// <summary>
        /// Ta bort ett språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="language">Språket som ska tas bort</param>
        /// <returns>Det nya språkets primärnyckel</returns>
        void DeleteLanguage(IDataContext context, ValueIdPair language);

        /// <summary>
        /// Ta bort ett ceremoni språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="language">Språket som ska tas bort</param>
        /// <returns>Det nya språkets primärnyckel</returns>
        void DeleteCeremonyLanguage(IDataContext context, ValueIdPair language);

        /// <summary>
        /// Ta bort ett certifikat språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="language">Språket som ska tas bort</param>
        /// <returns>Det nya språkets primärnyckel</returns>
        void DeleteCertificateLanguage(IDataContext context, ValueIdPair language);

        /// <summary>
        /// Hämta ett visst språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="name">Namnet på språket som efterfrågas</param>
        /// <returns>Språket</returns>
        ValueIdPair GetLanguage(IDataContext context, string name);

        /// <summary>
        /// Hämta ett visst språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="languadeId">Den unika nyckeln på språket som efterfrågas</param>
        /// <returns>Språket</returns>
        ValueIdPair GetLanguage(IDataContext context, int languadeId);

        /// <summary>
        /// Hämta alla språk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <returns>En lista med alla språk</returns>
        List<ValueIdPair> GetLanguages(IDataContext context);

        /// <summary>
        /// Hämta certifikatspråken
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <returns>En lista med språket</returns>
        List<ValueIdPair> GetCertificateLanguages(IDataContext context);

        /// <summary>
        /// Hämta ceremonispråken
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <returns>En lista med språket</returns>
        List<ValueIdPair> GetCeremonyLanguages(IDataContext context);

        /// <summary>
        /// Hämtar standardspråket
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <returns></returns>
        ValueIdPair GetDefaultLanguage(IDataContext context);

        /// <summary>
        /// Lägg till ett nytt ceremonispråk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="languageName">Namn på språket som ska läggas till</param>
        int AddCeremonyLanguage(IDataContext context, string languageName);

        /// <summary>
        /// Lägg till ett nytt certifikatspråk
        /// </summary>
        /// <param name="context">Det databascontext som operationen köra i</param>
        /// <param name="languageName">Namn på språket som ska läggas till</param>
        int AddCertificateLanguage(IDataContext context, string languageName);

    }
}